/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import dao.AlunoJpaController;
import dominio.Aluno;
import java.util.List;
import dao.Dao;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Nathalie.ramos
 */
public class AlunoNegocio implements Negocio {

    private final String MS01 = "Aluno Inserido com Sucesso!";
    private final String MS02 = "Preencha Todos os Campos Obrigatorios";
    private final String MS03 = "Aluno Alterado com Sucesso";
    private final String MS04 = "Nada Encontrado";
    private final String MS05 = "Erro no Banco de Dados. Tente mais tarde!";
    private final int numCamposObr = 17;
    private String mensagem;
    private Dao dao;

    public AlunoNegocio() {
        dao = new AlunoJpaController();
    }

    public boolean inserir(Object objeto) {
        if (objeto == null) {
            setMensagem("Aluno nulo");
            return false;
        }
        Aluno aluno = (Aluno) objeto;

        if (!datasValidas(aluno)) {
            return false;
        }

        if (!cpfValido(aluno)) {
            mensagem = "Digite um CPF válido!";
            return false;
        }

        if (camposObrigatorios(aluno) < numCamposObr) {
            mensagem = MS02;
            return false;
        }

        if (aluno.getId() != null) {
            setMensagem("Aluno já existe");
            return false;
        }

        if (!cpfUnico(aluno)) {
            return false;
        }

        try {
            dao.create(aluno);
            mensagem = MS01;
        } catch (Exception e) {
            mensagem = MS05;
            return false;
        }
        return true;
    }

    private boolean cpfValido(Aluno aluno) {

        if (aluno.getCpf() == null || aluno.getCpf().equals(new String())) {
            return true;
        }

        if (aluno.getCpf().length() != 11) {
            return false;
        }

        int[] cpf = new int[11];
        int dv;
        int d = 0;

        for (int i = 0; i < aluno.getCpf().length(); i++) {
            cpf[i] = Integer.parseInt(aluno.getCpf().substring(i, i + 1));
        }
        for (int j = 0; j < 2; j++) {
            dv = 0;
            for (int i = 0; i < (j + 9); i++) {
                dv += (cpf[i] * (j + 10 - i));
            }
            dv %= 11;

            if (dv < 2) {
                d = 0;
            } else {
                d = 11 - dv;
            }
            if (d != cpf[ 9 + j]) {
                return false;
            }
        }

        boolean iguais = true;
        int i = 0;
        while (iguais && (i < 9)) {
            iguais = cpf[i] == cpf[++i];
        }
        return !iguais;
    }

    public boolean cpfUnico(Aluno aluno) {

        if(aluno.getCpf().equals(new String())){
            return true;
        }

        Aluno al = new Aluno();

        al.setCpf(aluno.getCpf());

        List res = new ArrayList<Aluno>();

        res = pesquisar(al);

        if (res != null && !(res.isEmpty())) {
            if (aluno.getId() != null) {
                for (int i = 0; i < res.size(); i++) {
                    Aluno alu = (Aluno) res.get(i);
                    if (!alu.getId().equals(aluno.getId())) {
                        mensagem = "CPF já cadastrado";
                        return false;
                    }
                }
            } else {
                if (!(res.isEmpty())) {
                    mensagem = "CPF já cadastrado";
                    return false;
                }
            }
        }
        return true;
    }

    public boolean datasValidas(Aluno aluno) {
        if (aluno.getDataNascimento().after(new Date())) {
            return false;
        }
        if (aluno.getDataNascimento().after(aluno.getDataEmissao())) {
            return false;
        }
        return true;
    }

    private int camposObrigatorios(Aluno aluno) {
        int i = 0;

        if (aluno.getCartorio() != null) {
            i++;
        }

        if (aluno.getCidade() != null) {
            i++;
        }

        if (aluno.getDataEmissao() != null) {
            i++;
        }

        if (aluno.getDataNascimento() != null) {
            i++;
        }

        if (aluno.getEndContato() != null) {
            i++;
        }

        if (aluno.getEscola() != null) {
            i++;
        }

        if (aluno.getFolha() != null) {
            i++;
        }

        if (aluno.getLivro() != null) {
            i++;
        }

        if (aluno.getNaturalidade() != null) {
            i++;
        }

        if (aluno.getNomeAluno() != null) {
            i++;
        }

        if (aluno.getNumRegistro() != null) {
            i++;
        }

        if (aluno.getPais() != null) {
            i++;
        }

        if (aluno.getRespCliente() != null) {
            i++;
        }

        if (aluno.getRespInscricao() != null) {
            i++;
        }

        if (aluno.getTelContato() != null) {
            i++;
        }

        if (aluno.getSexo() != -1) {
            i++;
        }

        if (aluno.getTurno() != null) {
            i++;
        }

        return i;
    }

    public boolean alterar(Object objeto) {
        if (objeto == null) {
            mensagem = "Aluno nulo";
            return false;
        }
        Aluno aluno = (Aluno) objeto;

        if (!datasValidas(aluno)) {
            return true;
        }

        if (camposObrigatorios(aluno) < numCamposObr) {
            return false;
        }

        if (!cpfValido(aluno)) {
            mensagem = "Digite um CPF Válido";
            return false;
        }

        if (aluno.getId() == null) {
            mensagem = "Aluno não existe";
        }

        if (!cpfUnico(aluno)) {
            return false;
        }

        try {
            dao.edit(aluno);
            mensagem = MS03;
        } catch (Exception e) {
            mensagem = MS05;
            return false;
        }
        return true;
    }

    /**
     *
     * @return List com todos os alunos
     */
    public List listar() {
        List res;
        try {
            res = dao.findObjectEntities();
        } catch (Exception e) {
            mensagem = MS05;
            return null;
        }
        return res;
    }

    /**
     *
     * @param aluno
     * @return Lista com todos os objetos Aluno existentes no banco de dados que
     * tenham as características do objeto Aluno fornecido como parâmetro
     */
    public List<Object> pesquisar(Object objeto) {
        if (objeto == null) {
            mensagem = "Aluno nulo";
            return null;
        }

        Aluno aluno = (Aluno) objeto;

        List res = new ArrayList<Aluno>();


        if (aluno.getId() != null) {
            Aluno a = (Aluno) dao.findObject(aluno.getId());
            res.add(a);
            mensagem = "Apenas um encontrado";
            return res;
        }

        try {
            res = dao.pesquisar(aluno);
        } catch (Exception e) {
            mensagem = MS05;
            System.out.println(e.getMessage());
            return null;
        }

        if (res.isEmpty()) {
            mensagem = MS04;
            /*
             * retornará null para facilitar a organização do controlador da janela
             * assim, toda vez q esse método retornar null, o controlador da janela
             * virá buscar a mensagem.
             */
            return null;
        }

        return res;
    }

    public String getMensagem() {
        return mensagem;
    }

    /**
     * @param mensagem the mensagem to set
     */
    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    /*
     * Este método que não existe no CDU, mas como está na interface
     * Negocio teve que ser implementado
     */
    public boolean excluir(Object objeto) {
        return false;
    }
}
